package com.electric.qrapp.utils.function

import android.content.Context
import android.graphics.Bitmap
import androidx.lifecycle.MutableLiveData
import com.electric.qrapp.utils.system.showToast
import com.electric.qrapp.utils.view.LoadingUtils
import com.forjrking.lubankt.Luban
import com.pokemon.apkupdate.utils.FileUtil
import java.io.File

/**
 *@author created by WA03675
 *@date  2022-03-21 16:38
 *@des 文件压缩
 */
fun compressFile(
    context: Context, cacheDir: String, fileList: List<String>, liveData: MutableLiveData<String>, loadingUtils: LoadingUtils
) {
    Luban.with()               //(可选)Lifecycle,可以不填写内部使用ProcessLifecycleOwner
        .load(fileList)                       //支持 File,Uri,InputStream,String,Bitmap 和以上数据数组和集合
        .setOutPutDir(cacheDir)              //(可选)输出目录文件夹
        .concurrent(true)                //(可选)多文件压缩时是否并行,内部优化线程并行数量防止OOM
        .useDownSample(true)             //(可选)压缩算法 true采用邻近采样,否则使用双线性采样(纯文字图片效果绝佳)
        .format(Bitmap.CompressFormat.PNG)//(可选)压缩后输出文件格式 支持 JPG,PNG,WEBP
        .ignoreBy(200)                   //(可选)期望大小,大小和图片呈现质量不能均衡所以压缩后不一定小于此值, //(可选)质量压缩系数  0-100
        .rename { "pic$it" }             //(可选)文件重命名
        .compressObserver {
            onSuccess = { it ->
//                val fileCompressList = mutableListOf<String>()
//                getFiles(cacheDir, fileCompressList)
//                var path = ""
//                fileList.forEach {
//                    path += "$it,"
//                }
                val base64Sb = StringBuilder()
                it.forEachIndexed { index, file ->
                    base64Sb.append(FileUtil.imageToBase64(file.absolutePath))
                    if (index != it.size - 1) {
                        base64Sb.append(",")
                    }
                }
//                val base64 = FileUtil.imageToBase64(it[0].absolutePath);
                liveData.postValue(base64Sb.toString())
            }
            onStart = {
                loadingUtils.showLoading(context, true)
            }
            onCompletion = {
                loadingUtils.showLoading(context, false)

            }
            onError = { e, _ ->
                showToast(msg = "图片压缩失败,请重新选择图片")
                loadingUtils.showLoading(context, false)
            }
        }.launch()
}

private fun getFiles(filePath: String, fileArr: MutableList<String>): List<String?>? {
    val files = File(filePath).listFiles()
    for (k in files.indices) {
        if (files[k].isDirectory) {
            getFiles(files[k].path, fileArr)
        } else if (!files[k].isDirectory) {
            fileArr.add(files[k].absolutePath)
        }
    }
    return fileArr
}